package org.dtrd.config.wechat.api;

import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONObject;
import org.dtrd.common.util.oss.OssBootUtil;
import org.dtrd.config.wechat.entity.bean.miniprogram.CloudBase;
import org.dtrd.config.wechat.entity.bean.miniprogram.LineColor;
import org.dtrd.config.wechat.entity.bean.miniprogram.WxaInfo;

import java.io.InputStream;

/**
 * 微信小程序相关接口
 *
 * @author xiao
 */
public interface IWechatMiniprogramApi extends IWechatBaseApi {

    String CODE2SESSION_PATH = "https://api.weixin.qq.com/sns/jscode2session";

    /**
     * 生成已发布小程序二维码  永久有效  有数量限制
     */
    String CREATEWXAQRCODE = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=ACCESS_TOKEN";

    /**
     * 生成小程序码  永久有效  有数量限制  与 小程序二维码合计100,000
     */
    String GETWXACODE = "https://api.weixin.qq.com/wxa/getwxacode?access_token=ACCESS_TOKEN";

    /**
     * 获取无限制小程序码  永久有效  无数量限制
     */
    String GETWXACODEUNLIMIT = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN";

    /**
     * 获取小程序 scheme 码，适用于短信、邮件、外部网页、微信内等拉起小程序的业务场景
     */
    String GENERATESCHEME = "https://api.weixin.qq.com/wxa/generatescheme?access_token=ACCESS_TOKEN";

    /**
     * 查询小程序 scheme 码，及长期有效 quota
     */
    String QUERYSCHEME = "https://api.weixin.qq.com/wxa/queryscheme?access_token=ACCESS_TOKEN";

    /**
     * 获取小程序 URL Link，适用于短信、邮件、网页、微信内等拉起小程序的业务场景
     */
    String GENERATELINK = "https://api.weixin.qq.com/wxa/generate_urllink?access_token=ACCESS_TOKEN";

    /**
     * 查询小程序 url_link 配置，及长期有效 quota。
     */
    String QUERYLINK = "https://api.weixin.qq.com/wxa/query_urllink?access_token=ACCESS_TOKEN";

    /**
     * 小程序码达到数量限制
     *
     * @param json
     * @return
     */
    default boolean isReachedQrCodeLimit(JSONObject json) {
        return json.getIntValue(ERRCODE) == ERROR_CODE_REACHED_LIMIT;
    }

    /**
     * 上传小程序码至阿里云
     *
     * @param httpResponse
     * @return
     */
    default String upload(HttpResponse httpResponse) {
        if (httpResponse.body().contains("errcode")) {
            return null;
        } else {
            InputStream inputStream = httpResponse.bodyStream();
            String url = OssBootUtil.upload(inputStream, "miniprogram/" + System.currentTimeMillis() + ".png");
            return url;
        }
    }

    /**
     * jsCode 解析Session
     */
    JSONObject code2Session(String clientId, String accessKeySecret, String jsCode);

    /**
     * 微信小程序数解密
     *
     * @param sessionKey
     * @param encryptedData
     * @param rawData
     * @param iv
     * @param signature
     * @return
     */
    JSONObject decryptInfo(String sessionKey, String encryptedData, String rawData, String iv, String signature);

    /**
     * 生成已发布小程序二维码
     *
     * @param accessToken
     * @param path        小程序页面路径
     * @param width       图片宽度 280px-1280px
     * @return
     * @see <a href="https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.createQRCode.html">createQRCode</a>
     */
    String createQRCode(String accessToken, String path, int width);

    /**
     * 生成已发布小程序码
     *
     * @param accessToken
     * @param path        页面路径
     * @param envVersion  要打开的小程序版本。{@link org.dtrd.config.wechat.config.WechatConstant.MiniprogramVersion}
     * @param width       二维码宽度  最小 280px，最大 1280px
     * @param autoColor   自动配置线条颜色，如果颜色依然是黑色，则说明不建议配置主色调  默认false
     * @param lineColor   autoColor 为 false 时生效，使用 rgb 设置颜色 例如 {"r":"xxx","g":"xxx","b":"xxx"} 十进制表示
     * @param isHyaline   是否需要透明底色 默认 false
     * @return
     * @see <a href="https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.get.html">getwxacode</a>
     */
    String getWxacode(String accessToken, String path, String envVersion, int width, boolean autoColor, LineColor lineColor, boolean isHyaline);

    /**
     * 生成已发布的小程序码，适用于需要的码数量极多的业务场景。通过该接口生成的小程序码，永久有效，数量暂无限制。
     *
     * @param accessToken 接口调用凭证
     * @param scene 场景值
     * @param page 页面
     * @param checkPath 检查page是否存在：true为已经发布的小程序存在的页面；false时允许小程序未发布或者page不存在
     * @param envVersion 要打开的小程序的版本
     * @param width 二维码的宽度，单位 px，最小 280px，最大 1280px
     * @param autoColor 自动配置线条颜色，如果颜色依然是黑色，则说明不建议配置主色调，默认 false
     * @param lineColor auto_color 为 false 时生效，使用 rgb 设置颜色，十进制表示
     * @param isHyaline 是否需要透明底色，为 true 时，生成透明底色的小程序
     * @return
     */
    String getUnlimitWxacode(String accessToken, String scene, String page, boolean checkPath, String envVersion, int width, boolean autoColor, LineColor lineColor, boolean isHyaline);

    /**
     * 获取小程序 scheme 码，适用于短信、邮件、外部网页、微信内等拉起小程序的业务场景。有效期最长30天，不再永久有效
     *
     * @param accessToken     必填
     * @param isExpire       非必填  生成的 scheme 码类型，到期失效：true，永久有效：false
     * @param jumpWxa        非必填  跳转到的目标小程序信息
     * @param expireType     非必填  到期失效的 scheme 码失效类型，失效时间：0，失效间隔天数：1
     * @param expireTime     非必填  expire_type 传值为 0，需注意 expire_time 传值的时间戳不超过 30 天，即该参数最长传值有效期为 30 天；
     * @param expireInterval 非必填  expire_type 传值为 1，需注意 expire_interval 传值范围为 [1, 30]，即该参数最长传值间隔天数为 30
     * @return
     * @see <a href="https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-scheme/urlscheme.generate.html">generatescheme</a>
     * @see <a href="https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/url-scheme.html">url-scheme</a>
     */
    String generateScheme(String accessToken, boolean isExpire, WxaInfo jumpWxa, int expireType, int expireTime, int expireInterval);

    /**
     * 查询小程序 scheme 码，及长期有效 quota
     *
     * @param accessToken
     * @param scheme      小程序 scheme 码
     * @return
     */
    String queryScheme(String accessToken, String scheme);

    /**
     * 获取小程序 URL Link，适用于短信、邮件、网页、微信内等拉起小程序的业务场景。
     *
     * @param accessToken 接口调用凭证
     * @param path 通过 URL Link 进入的小程序页面路径，必须是已经发布的小程序存在的页面，不可携带 query 。path 为空时会跳转小程序主页
     * @param query 通过 URL Link 进入小程序时的query，最大1024个字符
     * @param envVersion 要打开的小程序版本
     * @param isExpire 生成的 URL Link 类型，到期失效：true，永久有效：false
     * @param expireType 小程序 URL Link 失效类型，失效时间：0，失效间隔天数：1
     * @param expireTime 到期失效的 URL Link 的失效时间，为 Unix 时间戳
     * @param expireInterval 到期失效的URL Link的失效间隔天数
     * @param cloudBase 云开发静态网站自定义 H5 配置参数，可配置中转的云开发 H5 页面,不填默认用官方 H5 页面
     * @return
     */
    String generateLink(String accessToken, String path, String query, String envVersion, boolean isExpire, int expireType, int expireTime, int expireInterval, CloudBase cloudBase);

    /**
     * 查询小程序 url_link 配置，及长期有效 quota。
     *
     * @param accessToken 接口调用凭证
     * @param urlLink 小程序url_link
     * @return
     */
    String queryLink(String accessToken, String urlLink);

}
